/**
 * 
  1. 在子类中 使用 super 关键字调用父类的方法和存取器
  2. 有同名属性和方法的情况下，this关键字调用的是子类的属性和方法，方法重写
  3. 子类不存在，只有父类的有的属性和方法，this关键字调用父类的方法和属性
  4. 父类的属性 使用super关键字调用不到
 */

class Foo000 {
  // 静态属性
  static sBar = '父类静态属性sBar'
  // 私有属性
  #name = '父类私有属性#name'
  // 普通属性
  sex = '父类普通属性sex'

  age = 22

  // 构造函数
  constructor(msg) {
    console.log(msg)
  }

  // 获取器
  get name1 () {
    return this.#name
  }

  // 存储器
  set name1 (value) {
    this.#name = value
  }

  // 静态方法bar
  static bar () {
    // 静态方法bar调用了this.baz，这里的this指的是Foo类，而不是Foo的实例，
    this.baz()
  }
  // 静态方法baz
  static baz () {
    console.log('父类：静态方法baz')
  }
  // 普通方法baz
  baz () {
    console.log('父类：world#######' + this.#name)
  }
  // 普通方法bazf00
  bazf00 () {
    // 谁调用就是谁
    this.baz()
  }

  fufunc1 () {
    console.log('只有父类有这个方法fufunc1')
  }
}

class Shuiguo extends Foo000 {



  // 实验3 注释  实现2解开以下注释
  // age = 80

  // 普通方法baz
  // baz () {
  //   console.log('子类：world#######：baz')
  // }

  sonBaz () {
    console.log('----------------sonBaz--------------');
    console.log('Shuiguo:sonBaz()')

    console.log('----------------1--------------');
    // 1. 在子类中 使用 super 关键字调用父类的普通方法和存取器
    super.baz() // 1.1调用父类的普通方法
    super.name1 = '使用super调用的存储器' // 1.2调用存储器
    console.log(super.name1); // 1.3调用取值器




    console.log('----------------2--------------');

    // 2. 有同名属性和方法的情况下，this关键字调用的是子类的属性和方法，方法重写
    console.log(this.age);
    this.baz()

    console.log('----------------3--------------');

    // 3. 子类不存在，只有父类的有的属性和方法，this关键字调用父类的方法和属性
    // 此处实验需要注释掉子类和父类同名的属性 age 和 方法 baz
    console.log('----------------4--------------');


    // 4. 父类的属性 使用super关键字调用不到
    console.log(super.age);
  }


  /**
   * 子类的静态方法中 super 关键字 指向的是 父类名
   */
  static staticSonBaz () {

    console.log('-------------- staticSonBaz-------------');

    console.log('Shuiguo:sonBaz()')

    console.log('----------------1--------------');
    // 1. 在子类中 使用 super 关键字调用父类的普通方法和存取器
    super.baz() // 1.1调用父类的普通方法
    super.name1 = '使用super调用的存储器' // 1.2调用存储器
    console.log(super.name1); // 1.3调用取值器

    console.log(super.sBar);

    console.log('----------------2--------------');

    // 2. 有同名属性和方法的情况下，this关键字调用的是子类的属性和方法，方法重写
    console.log(this.age);
    this.baz()

    console.log('----------------3--------------');

    // 3. 子类不存在，只有父类的有的属性和方法，this关键字调用父类的方法和属性
    // 此处实验需要注释掉子类和父类同名的属性 age 和 方法 baz
    console.log('----------------4--------------');


    // 4. 父类的属性 使用super关键字调用不到
    console.log(super.age);
  }


}

let sg1 = new Shuiguo('实例化父类传参')

sg1.sonBaz()

Shuiguo.staticSonBaz()

/**
 * 
  1. 在子类中 使用 super 关键字调用父类的方法和存取器
  2. 有同名属性和方法的情况下，this关键字调用的是子类的属性和方法，方法重写
  3. 子类不存在，只有父类的有的属性和方法，this关键字调用父类的方法
  4. 父类的属性 使用super关键字调用不到
 */
